package site.addzero.cli.autoinit.common

import org.koin.core.annotation.Single
import site.addzero.cli.packagemanager.PackageManagerStrategty
import site.addzero.cli.platform.PlatformTools
import site.addzero.cli.platform.PlatformType
import site.addzero.cli.platform.runBoolean
import site.addzero.cli.platform.runCmd
import site.addzero.task.InitTask

/**
 * JDK 环境自动初始化类
 * 负责检查 JDK 是否安装，如果未安装则提供安装选项
 */
@Single
class AutoInitJdk : InitTask {
    override val support: Boolean = true

    /**
     * 执行 JDK 初始化任务
     */
    override suspend fun asynctask(): Boolean {
        // 检查 JDK 是否已安装
        if (!isJdkInstalled()) {
            println("JDK 未安装")
            val installJdk = PlatformTools.readBoolWithTrue("是否安装 JDK？")
            if (installJdk == true) {
                installJdk()
            }
        } else {
            println("JDK 已安装")
            val version = getJavaVersion()
            println("Java 版本: $version")
        }

        return true
    }

    /**
     * 检查 JDK 是否已安装
     */
    private fun isJdkInstalled(): Boolean {
        return "java -version".runBoolean()
    }

    /**
     * 获取 Java 版本信息
     */
    private fun getJavaVersion(): String {
        val result = "java -version".runCmd()
        return result.output.ifBlank { result.error }
    }

    /**
     * 安装 JDK
     */
    private suspend fun installJdk() {
        println("正在尝试安装 JDK...")

        try {
            val packageManager = PackageManagerStrategty.Companion.getSupportPackageManager()
            // 根据不同平台使用不同的包名
            val jdkPackageName = when (PlatformTools.getPlatformType()) {
                PlatformType.WINDOWS -> "Microsoft.OpenJDK.17"
                PlatformType.MACOS -> "openjdk@17"
                PlatformType.LINUX -> "openjdk-17-jdk"
                else -> "openjdk"
            }

            val result = packageManager.installPackage(jdkPackageName)

            if (result) {
                println("JDK 安装成功")
                val version = getJavaVersion()
                println("Java 版本: $version")
            } else {
                println("JDK 安装失败，请手动安装 JDK")
                printManualInstallationInstructions()
            }
        } catch (e: Exception) {
            println("JDK 安装过程中发生错误: ${e.message}")
            printManualInstallationInstructions()
        }
    }

    /**
     * 打印手动安装 JDK 的说明
     */
    private fun printManualInstallationInstructions() {
        println("请手动安装 JDK:")
        when (PlatformTools.getPlatformType()) {
            PlatformType.WINDOWS -> {
                println("Windows 用户可以从以下地址下载安装:")
                println("- Oracle JDK: https://www.oracle.com/java/technologies/downloads/")
                println("- OpenJDK: https://openjdk.org/")
                println("- Microsoft OpenJDK: https://learn.microsoft.com/en-us/java/openjdk/download")
            }
            PlatformType.MACOS -> {
                println("macOS 用户可以使用以下方式安装:")
                println("- Homebrew: brew install openjdk@17")
                println("- 或从 Oracle 或 OpenJDK 官网下载安装")
            }
            PlatformType.LINUX -> {
                println("Linux 用户可以使用包管理器安装:")
                println("- Ubuntu/Debian: sudo apt install openjdk-17-jdk")
                println("- CentOS/RHEL: sudo yum install java-17-openjdk-devel")
                println("- Fedora: sudo dnf install java-17-openjdk-devel")
                println("- 或从 Oracle 或 OpenJDK 官网下载安装")
            }
            else -> {
                println("请根据您的操作系统从 Oracle 或 OpenJDK 官网下载安装 JDK")
            }
        }
    }
}
